home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (C) 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- */
- /*----------------------------------------------------------------------------
- *
- * file : grafix.c
- *
- * Author : Yusuf Attarwala
- * Date : Sep 93
- *
- *---------------------------------------------------------------------------*/
- #include <X11/keysym.h>
- #include <strings.h>
- #include "Xmincludes.h"
- #include "globals_vol.h"
-
- #include <Xm/Protocols.h>
- #include <X11/StringDefs.h>
-
-
- Arg args[40];
- int argcnt;
-
- static short panning = 0;
- static long button1State,button2State,button3State;
- static long shiftKeyPress = 0,
- altKeyPress = 0;
- static long dx,dy,curX,curY,oldX,oldY;
- static long xPress,yPress,xRelease,yRelease;
- extern void doExit();
- extern unsigned long packc();
-
- void
- createGraphics(parent)
- Widget parent;
- {
- char *c;
- Widget frameD,frameS;
- Widget glwDbuffer,glwSbuffer;
- Widget gf;
-
- static int firstTime = 1;
- void gfxExposeCB(),
- gfxResizeCB(),
- gfxInitCB(),
- gfxInputCB();
-
- Atom xaWmDeleteWindow = XmInternAtom(display,"WM_DELETE_WINDOW",TRUE);
-
- static GLXconfig glxConfigD [] = {
- { GLX_NORMAL, GLX_DOUBLE, TRUE },
- { GLX_NORMAL, GLX_RGB, TRUE },
- { GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG },
- { 0, 0, 0 }
- };
-
- static GLXconfig glxConfigS [] = {
- { GLX_NORMAL, GLX_DOUBLE, FALSE },
- { GLX_NORMAL, GLX_RGB, TRUE },
- { GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG },
- { 0, 0, 0 }
- };
-
- argcnt = 0;
- if (textureMode == TEXTURE_2D) {
- XtSetArg(args[argcnt],XmNtitle, "2D Texture Vol Render");argcnt++;
- }
- else {
- XtSetArg(args[argcnt],XmNtitle, "3D Texture Vol Render");argcnt++;
- }
- XtSetArg(args[argcnt],XmNiconName,"VolTex");argcnt++;
- XtSetArg(args[argcnt],XmNkeyboardFocusPolicy, XmPOINTER);argcnt++;
- XtSetArg(args[argcnt],XmNdeleteResponse, XmUNMAP);argcnt++;
- XtSetArg(args[argcnt],XmNdefaultPosition, False);argcnt++;
- XtSetArg(args[argcnt],XmNminWidth, 300);argcnt++;
- XtSetArg(args[argcnt],XmNminAspectX, 1);argcnt++;
- XtSetArg(args[argcnt],XmNminAspectY, 1);argcnt++;
- XtSetArg(args[argcnt],XmNmaxAspectX, 1);argcnt++;
- XtSetArg(args[argcnt],XmNmaxAspectY, 1);argcnt++;
-
-
- gf = XtCreatePopupShell("ui",
- topLevelShellWidgetClass,parent,args,argcnt);
-
- XmAddWMProtocolCallback(gf,xaWmDeleteWindow,doExit,0);
-
- /* double buffer widget */
- argcnt = 0;
- XtSetArg(args[argcnt], XmNbackground,BlackPixel(display,screen)); argcnt++;
- frameD = XtCreateWidget("frameD", xmFrameWidgetClass,
- gf, args, argcnt);
-
- XtManageChild(frameD);
-
- argcnt = 0;
- XtSetArg(args[argcnt], GlxNglxConfig, glxConfigD); argcnt++;
- glwDbuffer = XtCreateWidget("gfx", glxMDrawWidgetClass,
- frameD, args, argcnt);
- XtManageChild(glwDbuffer);
-
- XtAddCallback(glwDbuffer, GlxNexposeCallback, gfxExposeCB, NULL);
- XtAddCallback(glwDbuffer, GlxNresizeCallback, gfxResizeCB, NULL);
- XtAddCallback(glwDbuffer, GlxNginitCallback, gfxInitCB, NULL);
- XtAddCallback(glwDbuffer, GlxNinputCallback, gfxInputCB, NULL);
-
- /* default to double buffer */
- glw = glwDbuffer;
- XtManageChild(gf);
-
- /*
- installColormaps(toplevel,glw);
- */
-
- /* single buffer */
- argcnt = 0;
- XtSetArg(args[argcnt], XmNbackground,BlackPixel(display,screen)); argcnt++;
- frameS = XtCreateWidget("frameS", xmFrameWidgetClass,
- parent, args, argcnt);
-
- argcnt = 0;
- XtSetArg(args[argcnt], GlxNglxConfig, glxConfigS); argcnt++;
- glwSbuffer = XtCreateWidget("gfx", glxMDrawWidgetClass,
- frameS, args, argcnt);
- XtManageChild(glwSbuffer);
- XtAddCallback(glwSbuffer, GlxNexposeCallback, gfxExposeCB, NULL);
- XtAddCallback(glwSbuffer, GlxNresizeCallback, gfxResizeCB, NULL);
- XtAddCallback(glwSbuffer, GlxNginitCallback, gfxInitCB, NULL);
- XtAddCallback(glwSbuffer, GlxNinputCallback, gfxInputCB, NULL);
-
- /*
- installColormaps(toplevel,glwSbuffer);
- */
-
- if (firstTime) {
- firstTime = 0;
- }
-
-
- GLXwinset(XtDisplay(glw), XtWindow(glw));
-
- setProjView(VIEW_TRANSF);
- setProjView(PROJ_TRANSF);
- }
-
- void
- gfxExposeCB(w,cd,cbs)
- Widget w;
- XtPointer *cd;
- GlxDrawCallbackStruct *cbs;
- {
- GLXwinset(XtDisplay(w), cbs->window);
- drawScene();
- }
-
- void
- gfxResizeCB(w,cd,draw_struct)
- Widget w;
- XtPointer *cd;
- GlxDrawCallbackStruct *draw_struct;
- {
- if (draw_struct->event != (XEvent *)NULL) {
- window_width = draw_struct->event->xconfigure.width;
- window_height = draw_struct->event->xconfigure.height;
- }
- else {
- argcnt = 0;
- XtSetArg(args[argcnt], XmNwidth, &window_width); argcnt++;
- XtSetArg(args[argcnt], XmNheight, &window_height); argcnt++;
- XtGetValues(w,args,argcnt);
- }
-
- computeWorldToScreenRatio();
-
- GLXwinset(XtDisplay(w), draw_struct->window);
- viewport(0, (Screencoord) draw_struct->width-1,
- 0, (Screencoord) draw_struct->height-1);
-
- setProjView(VIEW_TRANSF);
- setProjView(PROJ_TRANSF);
- drawScene();
-
-
- }
-
- void
- gfxInitCB(w,cd,cbs)
- Widget w;
- XtPointer *cd;
- GlxDrawCallbackStruct *cbs;
- {
- GLXwinset(XtDisplay(w), cbs->window);
- computeWorldToScreenRatio();
-
- }
-
- Boolean
- trackBallMotion()
- {
- setProjView(MODL_TRANSF);
- refresh = 1;
- drawScene();
- return(0);
- }
-
- void
- animation(flag)
- int flag;
- {
- Boolean trackBallMotion();
- static XtWorkProcId wpid;
-
- if (flag == 0) {
- if (trackBall == 1) XtRemoveWorkProc(wpid);
- trackBall = 0;
- }
- else if (trackBall == 0) {
- trackBall = 1;
- wpid = XtAppAddWorkProc(appContext,trackBallMotion,NULL);
- }
- }
-
- static int cInd[] = {_X,_X,_Y,_Y,_Z,_Z};
- static int sliceInd[] = {1,0,3,2,5,4};
-
- void
- gfxInputCB(w,cd,draw_struct)
- Widget w;
- XtPointer *cd;
- XmDrawingAreaCallbackStruct *draw_struct;
- {
- static Time oldTime = 0, newTime;
- static short doubleClick = 0;
- static short rubberBandZoom = 0;
- char string[31];
- XComposeStatus composeStatus;
- KeySym keysym;
- float rl,tb;
-
- switch(draw_struct->event->type) {
- case ButtonPress :
-
- xPress = oldX = curX = draw_struct->event->xbutton.x;
- yPress = oldY = curY = draw_struct->event->xbutton.y;
-
- switch(draw_struct->event->xbutton.button){
- case Button1 :
- button1State = 1;
- newTime = draw_struct->event->xbutton.time;
- if (newTime-oldTime < 500)
- doubleClick = 1;
- else
- doubleClick = 0;
- oldTime = newTime;
-
-
- if (degenMode) intoDegenerate();
-
- if (shiftKeyPress) {
- animation(1);
- }
- else {
- animation(0);
- }
- if (altKeyPress) {
- rubberBandZoom = 1;
- drawScene();
- drawScene();
- logicop(LO_XOR);
- frontbuffer(TRUE);
- loadmatrix(identity);
- pushmatrix();
- loadmatrix(identity);
- ortho2(0.0,(float)window_width,0.0,(float)window_height);
- }
-
- break;
- case Button2 :
- button2State = 1;
- if (degenMode) intoDegenerate();
- if (!button1State) {
- panning = TRUE;
- }
- else
- panning = FALSE;
- break;
- case Button3 :
- button3State = 1;
- break;
- }
- break;
- case ButtonRelease :
-
- xRelease = draw_struct->event->xbutton.x;
- yRelease = draw_struct->event->xbutton.y;
-
- switch(draw_struct->event->xbutton.button){
- case Button1 :
- button1State = 0;
- if (degenMode) outofDegenerate();
- break;
- case Button2 :
- button2State = 0;
- if (degenMode) outofDegenerate();
- break;
- case Button3 :
- button3State = 0;
- break;
- }
- break;
- case MotionNotify :
- dx = oldX - curX;
- dy = oldY - curY;
-
- oldX = curX;
- oldY = curY;
-
- curX = draw_struct->event->xbutton.x;
- curY = draw_struct->event->xbutton.y;
-
- if (rubberBandZoom) {
- RGBcolor(255,255,255);
- move2i(xPress,window_height-yPress);
- draw2i(xPress,window_height-oldY);
- draw2i(oldX,window_height-oldY);
- draw2i(oldX,window_height-yPress);
- draw2i(xPress,window_height-yPress);
-
- move2i(xPress,window_height-yPress);
- draw2i(xPress,window_height-curY);
- draw2i(curX,window_height-curY);
- draw2i(curX,window_height-yPress);
- draw2i(xPress,window_height-yPress);
- break;
- }
- else if (button1State && button2State && panning) {
- rl = dx*x_world_per_pixel;
- tb = dy*y_world_per_pixel;
- left += rl;
- right += rl;
- top -= tb;
- bottom -= tb;
- setProjView(PROJ_TRANSF);
- }
- else if (button1State) {
- if (button2State) {
- anglez = (abs(dx) >= abs(dy)) ? dx : dy;
- }
- else {
- if (screenAxes) {
- anglex = -dy;
- angley = -dx;
- }
- else {
- if (abs(dx) >= abs(dy)) {
- anglex = dx;
- }
- else {
- angley = -dy;
- }
- }
- }
- setProjView(MODL_TRANSF);
- }
- else if (button2State) {
- /* zooming */
- rl = (abs(dx) >= abs(dy)) ? dx*x_world_per_pixel :
- dy*y_world_per_pixel ;
- left -= rl;
- right += rl;
- tb = rl/world_aspect;
- top += tb;
- bottom -= tb;
-
- if (left >= right) {
- left += rl;
- right -= rl;
- top -= tb;
- bottom += tb;
- }
- else
- setProjView(PROJ_TRANSF);
-
- }
- refresh = 1;
- drawScene();
- break;
- case KeyPress :
- XLookupString(draw_struct->event,string,
- 30,&keysym,&composeStatus);
-
- switch(keysym) {
- case XK_Shift_L :
- case XK_Shift_R :
- shiftKeyPress = 1;
- break;
- case XK_Alt_L :
- case XK_Alt_R :
- altKeyPress = 1;
- break;
- }
- break;
- case KeyRelease :
- XLookupString(draw_struct->event,string,
- 30,&keysym,&composeStatus);
-
- switch(keysym) {
- case XK_a :
- if (cpackAlpha > 0xff) {
- XBell(display,25);
- cpackAlpha = 0xff;
- }
- cpackAlpha += 1;
- cpackValue = packc(cpackAlpha,cpackBlue,cpackGreen,cpackRed);
- drawScene();
- break;
- case XK_b :
- cpackAlpha -= 1;
- if (cpackAlpha < 0) {
- XBell(display,25);
- cpackAlpha = 0;
- }
- cpackValue = packc(cpackAlpha,cpackBlue,cpackGreen,cpackRed);
- drawScene();
- break;
- case XK_o :
- obliquePlaneToggle();
- drawScene();
- break;
- case XK_r :
- resetView();
- break;
- case XK_Shift_L :
- case XK_Shift_R :
- shiftKeyPress = 0;
- break;
- case XK_Alt_L :
- case XK_Alt_R :
- altKeyPress = 0;
- break;
- case XK_F1 :
- if (fog) {fogMode = FG_VTX_EXP;defFog();}
- drawScene();
- break;
- case XK_F2 :
- if (fog) {fogMode = FG_PIX_EXP;defFog();}
- drawScene();
- break;
- case XK_F3 :
- if (fog) {fogMode = FG_VTX_EXP2;defFog();}
- drawScene();
- break;
- case XK_F4 :
- if (fog) {fogMode = FG_PIX_EXP2;defFog();}
- drawScene();
- break;
- case XK_F5 :
- if (fog) {fogMode = FG_VTX_LIN;defFog();}
- drawScene();
- break;
- case XK_F6 :
- if (fog) {fogMode = FG_PIX_LIN;defFog();}
- drawScene();
- break;
-
- case XK_F9 :
- lockAView = 1;
- drawScene();
- break;
- case XK_F10 :
- lockAView = 2;
- drawScene();
- break;
- case XK_F11 :
- lockAView = 3;
- drawScene();
- break;
- case XK_F12 :
- lockAView = 0;
- drawScene();
- break;
-
- case XK_Escape :
- doExit();
- break;
- case XK_Up :
- case XK_Down :
- if (!doClipping) break;
- if (activeClipPlane < 0 || activeClipPlane > 5) break;
- if (keysym == XK_Up) {
- clip[activeClipPlane].xyz[cInd[activeClipPlane]] += 0.35;
-
- /* check the limits */
- if (clip[activeClipPlane].xyz[cInd[activeClipPlane]] >
- clip[activeClipPlane].max) {
- XBell(display,25);
- clip[activeClipPlane].xyz[cInd[activeClipPlane]] -= 0.35;
- break;
- }
- if (moveSlice) {
- clip[sliceInd[activeClipPlane]].xyz[cInd[activeClipPlane]]
- += 0.35;
-
- if (clip[sliceInd[activeClipPlane]].xyz[cInd[activeClipPlane]] >
- clip[sliceInd[activeClipPlane]].max) {
- XBell(display,25);
- clip[sliceInd[activeClipPlane]].xyz[cInd[activeClipPlane]]
- -= 0.35;
-
- clip[activeClipPlane].xyz[cInd[activeClipPlane]] -= 0.35;
- break;
- }
- }
-
- }
- else {
- clip[activeClipPlane].xyz[cInd[activeClipPlane]] -= 0.35;
- /* check the limits */
- if (clip[activeClipPlane].xyz[cInd[activeClipPlane]] <
- clip[activeClipPlane].min) {
- XBell(display,25);
- clip[activeClipPlane].xyz[cInd[activeClipPlane]] += 0.35;
- break;
- }
- if (moveSlice) {
- clip[sliceInd[activeClipPlane]].xyz[cInd[activeClipPlane]]
- -= 0.35;
-
- if (clip[sliceInd[activeClipPlane]].xyz[cInd[activeClipPlane]] <
- clip[sliceInd[activeClipPlane]].min) {
- XBell(display,25);
- clip[sliceInd[activeClipPlane]].xyz[cInd[activeClipPlane]]
- += 0.35;
-
- clip[activeClipPlane].xyz[cInd[activeClipPlane]] += 0.35;
- break;
- }
- }
- }
- clip[activeClipPlane].coeff[3] = -(
- clip[activeClipPlane].coeff[0]*clip[activeClipPlane].xyz[_X] +
- clip[activeClipPlane].coeff[1]*clip[activeClipPlane].xyz[_Y] +
- clip[activeClipPlane].coeff[2]*clip[activeClipPlane].xyz[_Z] );
-
- if (moveSlice) {
- clip[sliceInd[activeClipPlane]].coeff[3] = -(
- clip[sliceInd[activeClipPlane]].coeff[0]*clip[sliceInd[activeClipPlane]].xyz[_X] +
- clip[sliceInd[activeClipPlane]].coeff[1]*clip[sliceInd[activeClipPlane]].xyz[_Y] +
- clip[sliceInd[activeClipPlane]].coeff[2]*clip[sliceInd[activeClipPlane]].xyz[_Z] );
- }
-
- refresh = 1;
- drawScene();
- break;
- case XK_Right :
- if (fog) {
- fogDensity += 0.0001;
- if (fogDensity > 1.0) {
- XBell(display,25);
- fogDensity = 1.0;
- }
- defFog();
- }
- else if (lightWeight) {
- lightWeightCount += 1;
- if (lightWeightCount > 10) {
- XBell(display,25);
- lightWeightCount = 10;
- }
- }
- drawScene();
- break;
- case XK_Left :
- if (fog) {
- fogDensity -= 0.0001;
- if (fogDensity < 0.0) {
- XBell(display,25);
- fogDensity = 0.0;
- }
- defFog();
- }
- if (lightWeight) {
- lightWeightCount -= 1;
- if (lightWeightCount < 1) {
- XBell(display,25);
- lightWeightCount = 1;
- }
- }
- drawScene();
- break;
- default :
- break;
- }
- }
- }
-